package services;

import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import repositories.PresupuestoRepository;
import domain.Administrador;
import domain.ComunidadDeVecinos;
import domain.Incidencia;
import domain.Presupuesto;
import domain.Vecino;

@Service
@Transactional
public class PresupuestoService {

	// Managed Repository
	@Autowired
	private PresupuestoRepository presupuestoRepository;
	@Autowired
	private AdministradorService administradorService;
	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;

	@Autowired
	private VecinoService vecinoService;

	// Supporting Services

	// Constructors
	public PresupuestoService() {
		super();
	}

	// Simple CRUD methods

	public Presupuesto create() {
		Administrador principal;
		principal = administradorService.findByPrincipal();
		Assert.isTrue(principal instanceof Administrador);

		Presupuesto presupuesto;
		presupuesto = new Presupuesto();
		presupuesto.setFecha(new Date(System.currentTimeMillis()-1000));
		return presupuesto;
	}

	public void save(Presupuesto presupuesto) {
		Assert.notNull(presupuesto);
		Administrador principal;
		
		Assert.isTrue(presupuesto.getFecha().before(new Date()));
		if (presupuesto.getIncidencia() == null) {
			principal = administradorService.findByPrincipal();
			Assert.isTrue(principal instanceof Administrador);
		}

		
		if (presupuesto.getId() == 0) {
			presupuestoRepository.save(presupuesto);
		} else {
			Presupuesto anterior = findOne(presupuesto.getId());
			Assert.isTrue(anterior.getEstado().equals("Pendiente"));
			if (presupuesto.getIncidencia() != null) {
				Incidencia incidencia = presupuesto.getIncidencia();
				incidencia.setPresupuestos(new HashSet<Presupuesto>());
				incidencia.setEstado("Pendiente de presupuesto");
			}

			presupuestoRepository.save(presupuesto);

		}
	}

	public void delete(Presupuesto p) {
		Assert.notNull(p);
		presupuestoRepository.delete(p);
	}

	public Presupuesto findOne(int presupuestoId) {
		Presupuesto res;

		res = presupuestoRepository.findOne(presupuestoId);

		return res;
	}

	public Collection<Presupuesto> findAll() {
		Collection<Presupuesto> res;

		res = presupuestoRepository.findAll();

		return res;
	}

	public Collection<Presupuesto> findPresupuestosByComunidadDeVecinos(
			int comunidadId) {
		Collection<Presupuesto> res;
		Administrador administrador;
		administrador = administradorService.findByPrincipal();
		Assert.isTrue(administrador instanceof Administrador);
		res = presupuestoRepository
				.findPresupuestosByComunidadDeVecinos(comunidadId);

		return res;
	}

	public Collection<Presupuesto> findPresupuestosPendientesByComunidadDeVecinos(
			int comunidadId) {
		Collection<Presupuesto> res;
		Administrador administrador;
		administrador = administradorService.findByPrincipal();
		Assert.isTrue(administrador instanceof Administrador);
		res = presupuestoRepository
				.findPresupuestosPendientesByComunidadDeVecinos(comunidadId);

		return res;
	}

	public Collection<Presupuesto> findByPresidenteComunidad(int comunidadId) {
		Collection<Presupuesto> res;
		Vecino principal;
		ComunidadDeVecinos comunidad;

		comunidad = comunidadDeVecinosService.findOne(comunidadId);
		principal = vecinoService.findByPrincipal();

		Assert.isTrue(principal.equals(comunidad.getPresidente()));

		res = presupuestoRepository
				.findPresupuestosByComunidadDeVecinos(comunidadId);
		return res;
	}

	public Collection<Presupuesto> findPendientesByPresidenteComunidad(
			int comunidadId) {
		Collection<Presupuesto> res;
		Vecino principal;
		ComunidadDeVecinos comunidad;

		comunidad = comunidadDeVecinosService.findOne(comunidadId);
		principal = vecinoService.findByPrincipal();

		Assert.isTrue(principal.equals(comunidad.getPresidente()));

		res = presupuestoRepository
				.findPresupuestosPendientesByComunidadDeVecinos(comunidadId);
		return res;
	}

	public Collection<Presupuesto> findPresupuestoServicioAsytec() {
		Collection<Presupuesto> res;

		res = presupuestoRepository.findPresupuestosServicioAsytec();

		return res;
	}

	public Collection<Presupuesto> findPresupuestosServicioNoAceptado() {
		Collection<Presupuesto> presupuestos;
		Set<Presupuesto> res;

		res = new HashSet<Presupuesto>();
		presupuestos = presupuestoRepository.findPresupuestosServicio();
		for (Presupuesto r : presupuestos) {
			if (!r.getEstado().equals("No aceptado")) {
				res.add(r);
			}
		}

		return res;
	}

	public Collection<Presupuesto> findPresupuestoServicio() {

		Collection<Presupuesto> res;

		res = presupuestoRepository.findPresupuestosServicio();

		return res;

	}
}
